<?php
/* 数据库组操作方法
 * 数据库以组的形式存在，每组数据库一定会有一个主数据库master，多个从数据库
 * 取默认数据库组，且以默认主从分配数据库存时直接用JYDB::find()、JYDB::update等执行即可
 * 
 * 默认情况下:
 * 有数据变更的方法，如update,create,del,execute方法均自动取master，
 * 查询则随机取从数据库，没有从数据库时，直接以主数据库master执行
 * 
 * 指定数据库组及数据库时：
 * JYDB::getInstance(数据库组)->find()
 * JYDB::getInstance(数据库组.master)->find()
 * 当初始化时指定$dbAlias或以方法setAlias指定数据库，表示强制以指定数据库执所有方法,
 * 一般用于指定主数据执行find等查询方法 
 */
class JYDB{ 
	protected static $dbGroupPool = array();
	
	/*取表中单条记录
	 * @param $table 表名
	 * @param $where 查询条件,目前只支持sql，如"UNIT_ID=1"
	 * @param $fields 返回字符串名，多个以逗号分隔,如"UNIT_ID,UNIT_NAME"
	 * @param $order 排序字符串，如:id desc,hit
	 * @param $dbAlias 数据连接字符，缺省为默认数据库
	 * 返回： 结果数组
	 */  
	function find($table,$where,$fields='*',$order=''){
		return self::getInstance()->find($table,$where,$fields,$order);
	}
	
	/*取表中多条记录
	 * @param $table 表名
	 * @param $where 查询条件,目前只支持sql，如"UNIT_ID=1"
	 * @param $fields 返回字符串名，多个以逗号分隔,如"UNIT_ID,UNIT_NAME"
	 * @param $order 排序字符串，如:id desc,hit
	 * @param $page 页数，缺省为0表示返回所有记录，1则表示返回第一页
	 * @param $pageSize 每页记录数
	 * @param $totalCount 总记录数
	 * 返回： 结果数组
	 */  
	function findAll($table,$where='',$fields='*',$order='', $page = 0, $pageSize = 10,&$totalCount=0){
		return self::getInstance()->findAll($table,$where,$fields,$order, $page, $pageSize ,&$totalCount);
	}
	
	/*修改表中记录
	 * @param $table 表名
	 * @param $where 查询条件,目前只支持sql，如"UNIT_ID=1"
	 * @param $row 记录数据数组，以表字段名为键值，如:array('UNIT_NAME'=>'测试医院','UNIT_SPELL'=>'CSYY')
	 * 返回： -1 数据库执行失败；0 没有记录更变；大于 0 表示变列记录数
	 */  
	function update($table,$where,$row){
		return self::getInstance()->update($table,$where,$row);
	}

	/*新增表中记录
	 * @param $table 表名
	 * @param $where 查询条件,目前只支持sql，如"UNIT_ID=1"
	 * @param $row 记录数据数组，以表字段名为键值，如:array('UNIT_NAME'=>'测试医院','UNIT_SPELL'=>'CSYY')
	 * @param $pkField 自增长主键字段名,缺省时，需要$row自行传入主键值
	 * 返回： 成功则返回新记录ID，否则为失败
	 */  
	function create($table,$row,$pkField=''){
		return self::getInstance()->create($table,$row,$pkField);
	}
	
	/*删除表中记录
	 * @param $table 表名
	 * @param $where 查询条件,目前只支持sql，如"UNIT_ID=1"
	 * 返回： -1 数据库执行失败；0 没有记录更变；大于 0 表示变列记录数
	 */  
	function del($table,$where){
		return self::getInstance()->del($table,$where);
	}	
	
	/*【不推荐使用】执行一个修改sql
	 * 返回： -1 数据库执行失败；0 没有记录更变；大于 0 表示变列记录数
	 */ 
	function execute($sql){
		return self::getInstance()->execute($sql);
	}
	
	/*【不推荐使用】通过sql查询
	 * 返回： 结果数组
	 */ 
	function query($sql, $page = 0, $pageSize = 10,&$totalCount=0){
		return self::getInstance()->query($sql,$page,$pageSize,&$totalCount);
	}
	
	/*取数据库存对象
	 * @param string $database 数据库配置,默认取defaultDB.yml中的数据库组
	 * 每组数据库一定会有一个主数据库master
	 * 默认情况下:
	 * 有数据变更的方法，如update,create,del,execute方法均自动取master，
	 * 查询则随机取从数据库，没有从数据库时，直接
	 * 当使用如default.master时，表示强制以主数据库执所有方法
	 * @result DBBase 对象
	 */
	function getInstance($dbGroup = ""){
		if(!$dbGroup) $dbGroup = DEFAULT_DB_GROUP;	
		//取数据库配置
		list($dbGroup, $dbAlias) =  explode('.', $dbGroup);
		
		//数据库对象		
		if(!self::$dbGroupPool[$dbGroup]){
			$dbConfig = APIConfig::get($dbGroup.'DB');
			self::$dbGroupPool[$dbGroup] = new DBGroup($dbConfig);
		}
		
		//设置数据库别名
		self::$dbGroupPool[$dbGroup]->setAlias($dbAlias);
		
		return self::$dbGroupPool[$dbGroup];
	}
}